package de.dnb.basics.applicationComponents;

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class ListUtils {

    /**
     * Gibt das letzte Element einer Liste.
     * 
     * @param list	nicht null.
     * @return		Letztes Element der Liste oder null, wenn die Liste leer.
     */
    public static <T> T getLast(List<T> list) {
        RangeCheckUtils.assertReferenceParamNotNull("list", list);
        if (list.isEmpty())
            return null;
        int n = list.size();
        return list.get(n - 1);
    }

    /**
     * Entfernt das letzte Element einer Liste. Wenn die Liste leer
     * ist, wird nichts getan.
     * 
     * @param list	nicht null.
     * 
     */
    public static void removeLast(List<?> list) {
        RangeCheckUtils.assertReferenceParamNotNull("list", list);
        if (list.isEmpty())
            return;
        int n = list.size();
        list.remove(n - 1);
    }

    /**
     * Gibt das erste Element einer Liste.
     * 
     * @param list	nicht null.
     * @return		Erstes Element der Liste oder null, wenn die Liste leer.
     */
    public static <T> T getFirst(List<T> list) {
        RangeCheckUtils.assertReferenceParamNotNull("list", list);
        if (list.isEmpty())
            return null;
        return list.get(0);
    }

    /**
     * 
     * Gibt das Maximum einer Collection.
     * 
     * @param collection    nicht leer
     * @param <T>           implementiert {@link Comparable}
     * @return              Maximum
     * 
     */
    public static <T extends Comparable<T>> T getMax(
        final Collection<? extends T> collection) {
        RangeCheckUtils.assertCollectionParamNotNullOrEmpty("", collection);
        T max = null;
        for (T t : collection) {
            if (max == null)
                max = t;
            else if (t.compareTo(max) > 0)
                max = t;
        }
        return max;
    }

    /**
     * 
     * Gibt das Minimum einer Collection.
     * 
     * @param collection    nicht leer
     * @param <T>           implementiert {@link Comparable}
     * @return              Maximum
     * 
     */
    public static <T extends Comparable<T>> T getMin(
        final Collection<? extends T> collection) {
        RangeCheckUtils.assertCollectionParamNotNullOrEmpty("", collection);
        T max = null;
        for (T t : collection) {
            if (max == null)
                max = t;
            else if (t.compareTo(max) < 0)
                max = t;
        }
        return max;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 0, 7, 2, 3);
        System.out.println(getMax(list));
        System.out.println(getMin(list));
    }

}
